Android基础回顾之Intent
Intent是我们在开发中最经常用到的工具之一,不仅是各大组件内通信的工具,还是组件间交互的重要媒介。在平时开发的过程中可能很熟悉Intent的用法了,但有些细节可能会在开发中被忽略。
我们最常使用Intent都是在Activity交互时使用的,在我平时开发需求的过程中,90%都是这么用的:1
2Intent intent = new Intent(...);
startActivity(intent);
所以Intent的其他不常用的东西忘的都差不多了,是时候来回顾一下咯
Intent的属性
大家都知道显示和隐式启动Activity的方式,隐式启动用的少,重新熟悉一下咯。
component
component用来接收跳转Activity的信息,把需要跳转的两个Activity信息放入component中就能显式启动Activity.不过我平时都不用这个东西,就如上面写的,直接把Activity丢到Intent的构造函数里就好了。mark一下有这东西的存在免得哪天有人问。对了,还有一点,component还能记录当前Activity的包名类名啥的信息哟。
Action Category&& intent-filter
这三者配合就是隐式召唤Activity的利器,你懂的。
我是老记不住这三者怎么配合使用,以前看的时候立马懂了。过两天没写又忘光了一些细节,还是细节重要。
Action很简单,系统自带一些Action就不说了,自定义Action建一个局部变量就ok1
2
3public static final String MYACTION = "com.qunar.flight.lycc.action";
intent.setAction(MYACTION);
startActivity()...
然后就是在Manifest中配置intent-filter了。这个谁都会啦,有什么好讲的。。。。无聊嘛,写着玩咯,写多了就记住了
intent-filter中可以包含如下内容:
- 0-N个action
- 0-N个category
- 0-1个data
当Activity的intent-filter里有多少action它就能响应其中任意一个包含该action name的intent
而category嘛,匹配规则就是一一对对应了,intent的category和intent-filter的category必须100%对应上才能正常启动,intent自带 default category,所以写了
intent-filter就必须包含default category,比如我们的MainActivity,intent-filter就带了个default,你可以试试删了它看能不能玩
data和type
data是用来给Action提供数据的,一般都是传入一个Uri对象格式如下1
scheme://host:port/path
还一个就是type属性,是用来指定data属性的MIME类型的,支持自定义,格式如下:1
abc/xyz
data和type会覆盖
- 如果为Intent先设置data后设置type,type覆盖data,反之同反
- 如果希望Intent data和type都有,需要用setDataAndType()方法
关于这部分的匹配内容,真是懒得写了,太绕了,道理却又很简单,总结一下优先级和必要性就能记住了,用的时候在网上查吧,这东西用的少记住了也没啥卵用。
最后在记一个问题,就是intent的flag,面试过Android的同学估计90%都被问过这个问题,太无聊了
开头都是FLAGACTIVITY,我就省略了
- BROUGHT_ TO_FRONT,见名知意,如果某activity已经启动过了,用这中方式调起则直接弹出到栈顶,比如A先启动了,后来又有B,C,下次再启动A就是B,C,A
- CLEAR_TOP 自带Single_top,例如栈内有ABCD,这时候启动B,则栈内为AB,CD被弹出来了
- NEW_TASK 默认启动标注,总是重新创建一个新的
- NO_ANIMATION 启动不带动画哦
- NO_HISTORY 用这个东西启动的Activity不会留在栈里,例如现有ABC,用这种方式启动D,然后再普通启动E,这时栈内只有ABCE,D被E取代了不保留,及时你没调用finish方法。
- SINGLE_TOP 栈内只能有一个相同的,比如ABCD,再启动一个D,还是ABCD